﻿#define _CRT_SECURE_NO_WARNINGS 1

class Solution {
public:
    bool _Helper(vector<int> arr, int begin, int end)
    {
        if (begin >= end)
        {
            return true;
        }
        int root = arr[end];
        int start = begin;
        while (start < end && arr[start] <= root)
        {
            start++;
        }

        int tmp = start;
        while (start < end)
        {
            if (arr[start] <= root)
            {
                return false;
            }
            start++;
        }

        return _Helper(arr, begin, tmp - 1)
            && _Helper(arr, tmp, end - 1);
    }
    bool VerifySquenceOfBST(vector<int> sequence)         //BST的后序序列的合法序列是，对于一个序列S，最后一个元素是x （也就是root节点），如果去掉最后一个元素的序列为T，那么T满足：T可以分成两段，前一段（左子树）小于x，后一段（右子树）大于x，且这两段（子树）都是合法的后序序列
//验证思路就是：当前序列，及其子序列必须都满足上述定义
    {
        if (sequence.empty())
        {
            return false;
        }
        return _Helper(sequence, 0, sequence.size() - 1);
    }
};

/*
描述
输入一个整数数组，判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。

数据范围： 节点数量0≤n≤1000 ，节点上的值满足1≤val≤10^5
  ，保证节点上的值各不相同
要求：空间复杂度O(n) ，时间时间复杂度O(n^2)
提示：
1.二叉搜索树是指父亲节点大于左子树中的全部节点，但是小于右子树中的全部节点的树。
2.该题我们约定空树不是二叉搜索树
3.后序遍历是指按照 “左子树-右子树-根节点” 的顺序遍历
4.参考下面的二叉搜索树，示例 1

示例1
输入：
[1,3,2]

返回值：
true

说明：
是上图的后序遍历 ，返回true

*/

